package com.ceair.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ceair.entity.SysDictType;
import com.ceair.entity.request.dictionary.DictTypeInOrUpReq;
import com.ceair.entity.request.dictionary.QueryDictTypeReq;
import com.ceair.entity.result.PageResult;
import com.ceair.entity.result.Result;
import com.ceair.entity.vo.dictionary.SysDictTypeVO;
import com.ceair.service.ISysDictTypeService;
import com.ceair.utils.SysDictTypeStructMapper;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Optional;

/**
 * @author wangbaohai
 * @ClassName DictionaryController
 * @description: 字典管理控制器
 * @date 2025年03月27日
 * @version: 1.0.0
 */
@RestController
@RequestMapping("/api/v1/dictType")
@RequiredArgsConstructor
@Slf4j
@Tag(name = "字典类型管理", description = "字典类型管理相关接口")
public class SysDictTypeController {

    private final ISysDictTypeService sysDictTypeService;

    /**
     * 分页查询字典类型信息。
     *
     * @param queryDictTypeReq 字典类型信息查询请求对象，包含分页和查询条件等信息，不能为空。
     * @return 包含字典类型信息视图对象列表的分页结果，其中列表为转换后的 SysDictTypeVO 对象，分页结果包含总记录数。
     * <p>
     * 功能描述：
     * 1. 调用服务层方法进行分页查询，获取字典类型信息的分页数据。
     * 2. 将查询结果中的实体对象转换为视图对象（VO），并过滤掉转换失败的记录。
     * 3. 返回包含转换后视图对象列表和总记录数的分页结果。
     */
    @PreAuthorize("hasAnyAuthority('/api/v1/dictType/page')")
    @Parameter(name = "queryDictTypeReq", description = "字典类型信息查询请求对象", required = true)
    @Operation(summary = "分页查询字典类型信息")
    @PostMapping("/page")
    public PageResult<List<SysDictTypeVO>> queryDictTypeWithPage(@RequestBody QueryDictTypeReq queryDictTypeReq) {
        // 调用服务层方法进行分页查询，获取字典类型信息的分页数据
        Page<SysDictType> page = sysDictTypeService.queryDictTypeWithPage(queryDictTypeReq);

        // 将查询结果中的记录转换为视图对象（VO）列表，并过滤掉转换失败的记录
        List<SysDictTypeVO> list =
                Optional.ofNullable(page.getRecords()).orElse(Collections.emptyList()).parallelStream().map(record -> {
            try {
                // 使用映射器将实体对象转换为视图对象
                return SysDictTypeStructMapper.INSTANCE.toVO(record);
            } catch (Exception e) {
                // 记录转换失败的错误信息
                log.error("转换数据字典类型信息失败 具体原因为 : {}", e.getMessage());
                return null;
            }
        }).filter(Objects::nonNull).toList();

        // 返回包含转换后列表和列表大小的分页结果
        return PageResult.success(list, page.getTotal());
    }

    /**
     * 保存字典类型信息。
     *
     * @param dictTypeInOrUpReq 字典类型信息保存请求对象，包含需要保存的字典类型数据，不能为空。
     * @return 返回保存操作的结果，成功时返回包含字典类型视图对象（SysDictTypeVO）的成功响应，
     * 失败时返回包含错误信息的失败响应。
     * <p>
     * 功能描述：
     * 1. 调用服务层方法保存字典类型信息。
     * 2. 如果保存过程中发生异常，记录错误日志并返回包含详细错误信息的失败响应。
     * 3. 如果保存成功，返回包含保存后的字典类型信息的成功响应。
     */
    @PreAuthorize("hasAnyAuthority('/api/v1/dictType/save')")
    @Parameter(name = "dictTypeInOrUpReq", description = "字典类型信息保存请求对象", required = true)
    @Operation(summary = "保存字典类型信息")
    @PostMapping("/save")
    public Result<SysDictTypeVO> save(@RequestBody DictTypeInOrUpReq dictTypeInOrUpReq) {
        SysDictTypeVO sysDictTypeVO;

        try {
            // 调用服务层方法保存字典类型信息
            sysDictTypeVO = sysDictTypeService.save(dictTypeInOrUpReq);
        } catch (Exception e) {
            // 处理异常，记录错误信息
            log.error("新增数据字典类型失败 具体原因为 : {}", e.getMessage());
            return Result.error("新增数据字典类型失败,失败原因：" + e.getMessage());
        }

        // 返回保存成功的响应结果
        return Result.success(sysDictTypeVO);
    }


}
